Hello, 各位 iT 邦幫忙 的粉絲們大家好~~~
在本系列文因為工作上的產品應用需求,進而探索到很多層面的點滴事。
透過每篇 EP 的分享把這些點滴整理,看起來或許像是個獨立的小品抒發文、也或許是一系列技術研究文!?
總之,就當作的隨手雜記文吧!
本篇是 莫名其妙就跟世界等級的 OpenSource 專案攪和了!? 系列文的 EP28。
在 EP27 的介紹到發現了,在 Gstreamer 底下 Gstreamer-Sharp 的 source code 當中詭異的現象。
既然 Gstreamer 是 OpenSource 專案,當然有 Source Code 可以查看,也就可以自行修正並進行驗證。
首先來把 Gstreamer-Sharp 用 Visual Stduio 來開啟看看,而這邊有兩個選擇:
其一,找到 Gstreamer 底下的 subprojects 底下的 gstreamer-sharp 的 gstreamer-sharp.csproj:
其二,找到 Gstreamer 底下的 subprojects 底下的 gstreamer-sharp 底下的 source 的 gstreamer-sharp.csproj:
兩者有什麼不同嗎?
有。
前者是使用 .NET Framework 專案樣式,而後者則是用 .NET SDK 專案樣式:
詳情可參考 Microsoft Learn - .NET Project SDKs 的介紹:
https://learn.microsoft.com/dotnet/core/project-sdk/overview
無論是使用前者還是後者,這兩個專案檔指向同一份 gstreamer-sharp 的 source code 位置,這點倒是不用擔心。
所以找到位在 generated -> Gst -> MiniObject.cs 並修正前篇所說的疑惑點。
[DllImport("gstreamer-1.0-0.dll", CallingConvention = CallingConvention.Cdecl)]
static extern IntPtr gst_mini_object_ref(IntPtr raw);
protected override void Ref (IntPtr raw)
{
if (!Owned) {
gst_mini_object_ref (raw);
Owned = true;
}
}
[DllImport("gstreamer-1.0-0.dll", CallingConvention = CallingConvention.Cdecl)]
static extern void gst_mini_object_unref(IntPtr raw);
protected override void Unref (IntPtr raw)
{
if (Owned) {
gst_mini_object_unref (raw);
Owned = false;
}
}
重新編譯 gstreamer-sharp 專案,產生出新的 gstreamer-sharp.dll:
趕緊放到 GstreamerPlayer 專案來播放影片試試看,同時開啟工作管理員監看記憶體:
ㄚㄚㄚ~~~記憶體不再暴衝了啊!!!
那...
那...
那...
memory leak 的問題呢...情況有沒有改善?
趕緊來試試看!
把 GstreamerPlayer 改成與 EP20 相同的測試手法。
放著監測 5 分鐘的執行:
放著監測 30 多分鐘的執行:
看著這個算是平穩的線條...這真的是可喜可樂阿!
若有興趣可以參考此 Commit:
fix: memory explosion by using new gstreamer-sharp.dll